//
//  String.swift
//  73.表情字符串转表情
//
//  Created by gzxzmac on 16/4/3.
//  Copyright © 2016年 gzxzmac. All rights reserved.
//

import UIKit

extension String {
    /**
     表情字符串转表情
     
     - parameter text: 带表情名称的文本
     
     - returns: 带表情图片的属性文本
     */
    func emoticonTextToEmoticonAttrString(font: UIFont) -> NSAttributedString {
        // 1.获取微博文本里面的表情名称
        let pattern = "\\[.*?\\]"  // [] 在正在表达式里面有特殊含义需要转义
        let regular = try! NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.DotMatchesLineSeparators)
        
        let results = regular.matchesInString(self, options: NSMatchingOptions(rawValue: 0), range: NSRange(location: 0, length: self.characters.count))
        
        // 将普通文本转成属性文本,方便后面替换出图片
        let resultAttrString = NSMutableAttributedString(string: self)
        
        // 遍历每个结果
        // 如果重前面往后面替换会影响后面的范围
        // results.reverse(): 让数组反过来
        for result in results.reverse() {
            // 每个结果里面只有一个范围
//            print("一个结果")
//            let numberOfRanges = result.numberOfRanges
            let range = result.rangeAtIndex(0)
//            print("numberOfRanges: \(numberOfRanges)")
//            print("range: \(range)")
            
            // 1.查找到的表情名称
            let emoticonName = (self as NSString).substringWithRange(range)
//            print("查找到的表情名称: \(emoticonName)")
            
            // 2.根据表情名称查找表情模型 *
            if let emoticon = CZEmoticonPackageManager.emoticonNameToEmoticonModel(emoticonName) {
                // 真的找到了模型
                // 3.将表情模型里面的图片转成属性文本 *
                let attr = emoticon.emotionModeToAttr(font)
                
                // 4.将表情名称替换成表情图片的属性文本
                resultAttrString.replaceCharactersInRange(range, withAttributedString: attr)
                
                resultAttrString.addAttribute(NSFontAttributeName, value: font, range: NSRange(location: 0, length: resultAttrString.length))
                resultAttrString.addAttribute(NSForegroundColorAttributeName, value: UIColor.darkGrayColor(), range: NSRange(location: 0, length: resultAttrString.length))
            }
        }
        
        return resultAttrString
    }
}
